package com.cy.teducommunitys.com.common.config;

import com.cy.teducommunitys.com.cy.service.ShiroUserRealm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

import java.util.LinkedHashMap;

//Shiro核心对象配置
@Configuration
public class SpringShiroConfig {
    /**@Bean 描述的方法,其返回值会交给spring管理
     * @Bean 一般应用在整合第三bean资源时*/
    @Bean
    public SecurityManager newSecurityManager() {
        DefaultWebSecurityManager sManager=
                new DefaultWebSecurityManager();
        return sManager;
    }
    @Bean("shiroFilterFactory")
    public ShiroFilterFactoryBean newShiroFilterFactoryBean(
            @Autowired SecurityManager securityManager) {
        ShiroFilterFactoryBean sfBean=
                new ShiroFilterFactoryBean();
        sfBean.setSecurityManager(securityManager);
        //定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
        LinkedHashMap<String,String> map=
                new LinkedHashMap<>();
        //静态资源允许匿名访问:"anon"
        map.put("/bower_components/**","anon");
        map.put("/build/**","anon");
        map.put("/dist/**","anon");
        map.put("/plugins/**","anon");
        //map.put("/doLogout","logout");
        //除了匿名访问的资源,其它都要认证("authc")后访问
        //map.put("/**","authc");
        sfBean.setFilterChainDefinitionMap(map);
        return sfBean;
    }

    @Bean
    public SecurityManager newSecurityManager(@Autowired ShiroUserRealm realm) {
        DefaultWebSecurityManager sManager=
                new DefaultWebSecurityManager();
        sManager.setRealm(realm);
        return sManager;
    }

    @Bean("lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor
    newLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @DependsOn("lifecycleBeanPostProcessor")
    @Bean
    public DefaultAdvisorAutoProxyCreator newDefaultAdvisorAutoProxyCreator() {
        return new DefaultAdvisorAutoProxyCreator();
    }
    @Bean
    public AuthorizationAttributeSourceAdvisor
    newAuthorizationAttributeSourceAdvisor(
            @Autowired SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor=
                new AuthorizationAttributeSourceAdvisor();
        return advisor;
    }

}
